﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BLLEP.Presentacion;

namespace BLLEP.Funcionalidad
{
    public class BLLPedido: BLLGenerico
    {
        public BLLPedido(EstacionDePoderDataContext contexto) : base(contexto) { }
        public BLLPedido() : this(new EstacionDePoderDataContext()) { }

        public void CargarPedido(EP_Pedido nuevoPedido, List<EP_DetallePedido> detalles)
        {
            nuevoPedido.EP_EstadoPedido = new BLLEstadoPedido(Contexto).TraerPorDefecto();
            nuevoPedido.FechaCreado = DateTime.Now;
            Contexto.EP_Pedidos.InsertOnSubmit(nuevoPedido);

            nuevoPedido.Codigo = nuevoPedido.FechaCreado.Value.Year.ToString();
            nuevoPedido.Codigo += nuevoPedido.FechaCreado.Value.Month.ToString();
            nuevoPedido.Codigo += nuevoPedido.FechaCreado.Value.Day.ToString();
            nuevoPedido.Codigo += nuevoPedido.FechaCreado.Value.Hour.ToString();
            nuevoPedido.Codigo += nuevoPedido.FechaCreado.Value.Minute.ToString();
            nuevoPedido.Codigo += nuevoPedido.FechaCreado.Value.Second.ToString();

            int ultimoID = Contexto.EP_Pedidos.OrderByDescending(p => p.IdPedido).Select(p => p.IdPedido).FirstOrDefault();
            nuevoPedido.Codigo += (ultimoID + 1).ToString();

            foreach (EP_DetallePedido item in detalles)
                item.EP_Pedido = nuevoPedido;
            Contexto.EP_DetallePedidos.InsertAllOnSubmit(detalles);
        }

        public EP_Pedido Traer(string codigo)
        {
            return Contexto.EP_Pedidos.Where(p => p.Codigo.Equals(codigo)).FirstOrDefault();
        }

        public EP_Pedido Traer(int idPedido)
        {
            return Contexto.EP_Pedidos.Where(p => p.IdPedido == idPedido).FirstOrDefault();
        }

        public List<EP_DetallePedido> TraerDetalles(string codigo)
        {
            return Contexto.EP_DetallePedidos.Where(p => p.EP_Pedido.Codigo.Equals(codigo)).ToList();
        }

        public List<EP_DetallePedido> TraerDetalles(int idPedido)
        {
            return Contexto.EP_DetallePedidos.Where(p => p.EP_Pedido.IdPedido== idPedido).ToList();
        }

        public List<PedidoPresentacion> TraerPedidosPresentacion(string email)
        {
            List<PedidoPresentacion> pedidos = new List<PedidoPresentacion>();
            List<EP_Pedido> pedidosDB = (from p in Contexto.EP_Pedidos
                                         where p.EP_Usuario.Email.ToLower().Equals(email.ToLower())
                                         orderby p.FechaCreado descending
                                         select p).Take(100).ToList();

            foreach (EP_Pedido pedido in pedidosDB)
            {
                PedidoPresentacion pedidoPresentacion = new PedidoPresentacion();
                pedidoPresentacion.Codigo = pedido.Codigo;
                pedidoPresentacion.Estado = pedido.EP_EstadoPedido.Nombre;
                pedidoPresentacion.FechaCreado = pedido.FechaCreado.Value;
                pedidoPresentacion.IdPedido = pedido.IdPedido;

                foreach (EP_DetallePedido detalle in pedido.EP_DetallePedidos)
                    pedidoPresentacion.Total += (decimal) (detalle.Cantidad * detalle.PrecioUnitario);

                pedidos.Add(pedidoPresentacion);
            }

            return pedidos;
        }

        public void CancelarPedido(string email, int idPedido)
        {
            EP_Pedido pedido = Contexto.EP_Pedidos.Where(p => p.IdPedido == idPedido && p.EP_Usuario.Email.ToLower().Equals(email.ToLower())).FirstOrDefault();

            if (pedido == null)
                return;

            pedido.EP_EstadoPedido = new BLLEstadoPedido(Contexto).Traer(EstadoPedido.Cancelado.ToString());
        }

        public decimal CalcularTotal(EP_Pedido pedido)
        {
            decimal total = 0;

            foreach (EP_DetallePedido detalle in pedido.EP_DetallePedidos)
                total += (decimal) (detalle.Cantidad * detalle.PrecioUnitario);

            return total;
        }
    }
}
